package org.lemon.cla.controller;

import io.swagger.v3.oas.annotations.Hidden;
import jakarta.servlet.http.HttpServletRequest;
import org.lemon.cla.dto.response.ResponseResult;
import org.lemon.cla.enums.HttpStatusEnum;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * 兜底控制器：用于处理所有未匹配到的请求
 * 当前端的请求路径不正确（例如写错、多余的参数等）时，
 * 此控制器会返回友好的提示信息，而不是直接抛出 404 或其他异常。
 */
@RestController
@Hidden // 文档中隐藏此控制器
public class StupidRequestController implements ErrorController {

    private static final String PATH = "/error"; // 默认错误路径

    @RequestMapping(PATH)
    @ResponseBody // 返回 JSON 响应
    public ResponseResult<String> handleError(HttpServletRequest request) {
        // 获取 HTTP 状态码
        Object status = request.getAttribute(jakarta.servlet.RequestDispatcher.ERROR_STATUS_CODE);
        Integer statusCode = (status != null) ? (Integer) status : HttpStatus.INTERNAL_SERVER_ERROR.value();

        // 获取请求URI
        String requestURI = (String) request.getAttribute(jakarta.servlet.RequestDispatcher.ERROR_REQUEST_URI);
        if (requestURI == null) {
            requestURI = "未知路径"; // 处理直接访问 /error 的情况
        }

        // 根据状态码返回不同信息，这里主要处理 404
        if (statusCode == HttpStatus.NOT_FOUND.value()) {
            return ResponseResult.fail(
                    HttpStatusEnum.MIMADE.getCode(), // 或者使用你定义的 MIMADE 状态码
                    HttpStatusEnum.MIMADE.getMessage(),
                    "'" + requestURI + "' 路径不存在，请检查URL。"
            );
        }
        // 对于其他错误，可以返回通用错误信息
        return ResponseResult.fail(
                HttpStatusEnum.ERROR.getCode(),
                HttpStatusEnum.ERROR.getMessage(),
                "请求处理失败，状态码：" + statusCode
        );
    }
}